
package registrieren

import org.apache.commons.codec.digest.DigestUtils;
import src.de.checker.hochzeit.util.*;
import src.de.checker.hochzeit.domain.user.*;
import src.de.checker.hochzeit.konstanten.*
import com.google.appengine.api.datastore.*
import src.de.checker.hochzeit.domain.util.*;
import static com.google.appengine.api.datastore.FetchOptions.Builder.*

if(params?.reg ==~ /(?i)true/)
{
	register()
}
if(params?.pv ==~ /(?i)true/)
{
	neuespasswort()
}
private void neuespasswort()
{
	if(params.email)
	{
		if(!params.email.contains('@'))
		{
			request.message = 'Keine gültige E-Mail Adresse'
			forward "/registrieren/passwort.gtpl"
		}
		else
		{
			//E-Mail Adresse auf vorhandensein überprüfen
		 	def query2 = new Query(Konstanten.TELEKOMM)
			query2.addFilter("typ", Query.FilterOperator.EQUAL, new Long(0))
			query2.addFilter("wert", Query.FilterOperator.EQUAL, params.email)
			PreparedQuery preparedQuery2 = datastore.prepare(query2)
			def telekom  = preparedQuery2.asList( withLimit(100) )
			if(telekom)
			{
				String daten = ""
				for(i in telekom)
				{
					Long gid = i.gast
					Key k = KeyFactory.createKey(Konstanten.GAST, gid)
					try
					{
						Entity e = datastore.get(k)
						String psw = generateRandomString(7)
						daten +="Nutzername: "+e.loginname+"\nPasswort: "+psw+"\n"
						String myp = DigestUtils.md5Hex(psw)
						e.passwort = myp
						e.save()
					}
					catch(Exception e)
					{
						e.printStackTrace()
					}
				}
				if(!daten.equals(""))
				{
					String pre = "Dir wurden die folgenden neuen Nutzerdaten für den Hochzeitsplaner zugewiesen:\n\n"
					String post = "\nDer Hochzeitsplaner ist unter http://hochzeitschecker.appspot.com erreichbar.\nBei Fragen, Anmerkungen, Kritik oder sonstiges kannst du dich an checkerdev@googlemail.com wenden."
					sendMail(params.email, pre+daten+post,'Neue Zugangsdaten für den Hochzeitsplaner')
					request.message = 'Neue Zugangsdaten an ' +params.email +' versendet.'
				}
				forward '/index/index.gtpl'
			}
			else
			{
				request.message = 'Die E-Mail Adresse ist dem Hochzeitsplaner nicht bekannt. Bitte neu registrieren.'
				forward "/registrieren/passwort.gtpl"
			}
		}
	}
	else
	{
		request.message = 'Bitte E-Mail Adresse angeben, an die die neuen Zugangsdaten geschickt werden sollen.'
		forward "/registrieren/passwort.gtpl"
	}
}
private void register()
{
	
	if(params.vorname && params.nachname && params.email && params.nutzername)
	{
		def query = new Query(Konstanten.GAST)
		query.addFilter("loginname", Query.FilterOperator.EQUAL, params.nutzername)
		PreparedQuery preparedQuery = datastore.prepare(query)
	 	int erg = preparedQuery.countEntities() 
	 	
	 	//E-Mail Adresse auf vorhandensein überprüfen
	 	/*def query2 = new Query(Konstanten.TELEKOMM)
		query2.addFilter("typ", Query.FilterOperator.EQUAL, new Long(0))
		query2.addFilter("wert", Query.FilterOperator.EQUAL, params.email)
		PreparedQuery preparedQuery2 = datastore.prepare(query2)
		int erg2 = preparedQuery2.countEntities()*/
			 	
	 	//Es gibt bereits einen Nutzer mit diesem Loginnamen
		if(erg > 0)
		{
			request.message = 'Der Nutzername ist bereits vergeben. Bitte neuen wählen.'
			forward "/registrieren/index.gtpl"
		}
		//Es gibt bereits einen Nutzer mit dieser Mailadresse
		/*else if(erg2 > 0)
		{
			request.message = 'Die E-Mail Adresse hat bereits einen Zugang. Bitte neue wählen.'
			forward "/registrieren/index.gtpl"
		}*/
		else if(!params.email.contains('@'))
		{
			request.message = 'Keine gültige E-Mail Adresse'
			forward "/registrieren/index.gtpl"
		}
		else
		{
			
			String nn = params.nutzername
			
			def query1 = new Query(Konstanten.GAST)
			query1.addFilter("loginname", Query.FilterOperator.EQUAL, nn)
			PreparedQuery preparedQuery1 = datastore.prepare(query1)
		 	int erg1 = preparedQuery1.countEntities() 
		 	
		 	//Es gibt bereits eine Hochzeit mit diesem Namen
			if(erg1 > 0)
			{
				request.message = 'Der Nutzername ist bereits vergeben. Bitte neuen wählen.'
				forward "/registrieren/index.gtpl"
			}
			else
			{
				//Hochzeitsnamen checken
				String hochzeitname = 'hochzeit_'+params.nutzername.toLowerCase()
				int counter = 0;
				boolean namefree = !(hochzeitExists(hochzeitname))
				String orghochzeitname = hochzeitname
				while(!namefree) {
					counter++
					hochzeitname = orghochzeitname+'_'+counter
					namefree = !hochzeitExists(hochzeitname)
				}
			 	
				String mailnachricht = 'Hallo '+params.vorname+' '+params.nachname+'\n\nDir wurde ein Zugang zum Hochzeitsplaner mit den folgenden Daten erstellt:\n\n'
				String n1 = createUser(hochzeitname)
				mailnachricht +=n1
				mailnachricht += '\nDer Hochzeitsplaner ist unter http://hochzeitschecker.appspot.com erreichbar.\nBei Fragen, Anmerkungen, Kritik oder sonstiges kannst du dich an checkerdev@googlemail.com wenden.'
				
				sendMail(params.email, mailnachricht, 'Registrierung am Hochzeitsplaner erfolgreich')
				request.message = 'Zugang erstellt. Eine E-Mail mit dem Passwort wurde an ' +
						params.email +' versendet.'
				String tracernachricht = params.vorname +' ' + params.nachname + ' hat einen Zugang erstellt. Hochzeit: ' + hochzeitname
				createTracer(Konstanten.TRACER_NEUER_ZUGANG, tracernachricht)

				//auch an mich eine Nachricht versenden
				sendMail('checkerdev@googlemail.com', tracernachricht, 'Neue Registrierung am Hochzeitsplaner')
				
				forward '/index/index.gtpl'
			}
		}
		
	}
	else
	{
		request.message = 'Bitte alle Felder ausfüllen'
		forward "/registrieren/index.gtpl"
	}
}
private boolean hochzeitExists(String hochzeitname) {
	boolean exists = false;
	def query1 = new Query(Konstanten.GAST)
	query1.addFilter("feier", Query.FilterOperator.EQUAL, hochzeitname)
	PreparedQuery preparedQuery1 = datastore.prepare(query1)
 	int erg1 = preparedQuery1.countEntities() 
 	if(erg1 > 0) {
 		exists = true;
 		log.info('Versuche neue Hochzeit zu erstellen. Hochzeit '+hochzeitname+' existiert bereits in Gaeste')
 	}
	if(!exists) {
		def query2 = new Query(Konstanten.DELETED)
		query2.addFilter("feier", Query.FilterOperator.EQUAL, hochzeitname)
		PreparedQuery preparedQuery2 = datastore.prepare(query2)
	 	int erg2 = preparedQuery2.countEntities() 
	 	if(erg2 > 0) {
	 		exists = true;
	 		log.info('Versuche neue Hochzeit zu erstellen. Hochzeit '+hochzeitname+' existiert bereits in Deleted')
	 	}
	}
	return exists;
}
private void sendMail(String adresse, String inhalt, String header)
{
	System.out.println(inhalt)
	log.info('Versende Mail '+header+' an '+adresse)
	try
	{
		mail.send sender: Konstanten.EMAIL_NO_REPLY,
							to: adresse,
							subject: header,
							textBody: inhalt
		createTracer(Konstanten.TRACER_EMAIL, 'Mail ('+header+') '+adresse+' versendet.')
	}
	catch(Exception e)
	{
		e.printStackTrace()
	}
}
private void createTracer(String message)
{
	createTracer(Konstanten.TRACER_FORGOT, message);
}
private void createTracer(String type, String message) {
	try
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);

		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.type = type
	    t.nachricht = message
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		
	}
}   

private String createUser(String hochzeitname)
{
	String psw = generateRandomString(7)
	
	String mailnachricht = 'Nutzername: '+params.nutzername+'\nPasswort: '+psw+'\n'
	//Benutzer erstellen
	Gaeste nutzer = new Gaeste();
	nutzer.vorname = params.vorname
	nutzer.nachname = params.nachname
	nutzer.anzeigename = nutzer.vorname+' '+nutzer.nachname
	nutzer.rolle = new Long(0)
	nutzer.kategorie = new Long(0)
	nutzer.zusage = false
	nutzer.status = new Long(2)
	
	String myp = DigestUtils.md5Hex(psw)
	nutzer.loginname = params.nutzername
	nutzer.passwort = myp
	
	nutzer.feier = hochzeitname
	
	Entity e2 = nutzer as Entity
	e2.save()
	
	//E-Mail dazu erstellen
	Telekomm t = new Telekomm()
	t.typ = new Long(0)
	t.gast = e2.key.id
	t.wert = params.email
	
	Entity e = t as Entity
	e.save()
	String x= 'E-Mail: '+params.email+'\n';
	
	return mailnachricht+x
}
private String generateRandomString (int length)  {
	def availChars = []  
	('A'..'Z').each { availChars << it.toString() }  
	3.times { (0..9).each { availChars << it.toString() } } 	
	def max = availChars.size()      
	def rnd = new Random()  
	def sb = new StringBuilder()  
	length.times { sb.append(availChars[rnd.nextInt(max)]) }  
	return sb.toString()  
}   
